package settings

import (
	"fmt"
	"github.com/fsnotify/fsnotify"

	//"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
)

var Conf = new(AppConfig)

type AppConfig struct {
	Name      string `mapstructure:"name"`
	Mode      string `mapstructure:"mode"`
	Version   string `mapstructure:"version"`
	StartTime string `mapstructure:"start_time"`
	MachineID int64  `mapstructure:"machine_id"`
	Port      int    `mapstructure:"port"`

	*LogConfig   `mapstructure:"log"`
	*MySQLConfig `mapstructure:"mysql"`
	*RedisConfig `mapstructure:"redis"`
}

type MySQLConfig struct {
	Host         string `mapstructure:"host"`
	User         string `mapstructure:"user"`
	Password     string `mapstructure:"password"`
	DB           string `mapstructure:"dbname"` //要连接的 MySQL 数据库的名称
	Port         int    `mapstructure:"port"`
	MaxOpenConns int    `mapstructure:"max_open_conns"` //数据库连接池中最大打开连接数
	MaxIdleConns int    `mapstructure:"max_idle_conns"` //数据库连接池中最大空闲连接数
}

type RedisConfig struct {
	Host         string `mapstructure:"host"`
	Password     string `mapstructure:"password"`
	Port         int    `mapstructure:"port"`
	DB           int    `mapstructure:"db"`
	PoolSize     int    `mapstructure:"pool_size"` //连接池中最大连接数
	MinIdleConns int    //连接池中最少空闲连接数
}

// LogConfig 定义日志配置项
type LogConfig struct {
	// 日志级别，如 "info"、"debug" 等
	Level string `mapstructure:"level"`
	// 日志文件名
	Filename string `mapstructure:"filename"`
	// 单个日志文件最大大小（MB）
	MaxSize int `mapstructure:"max_size"`
	//日志文件保留最大天数
	MaxAge int `mapstructure:"max_age"`
	// 保留的最大日志文件数量
	MaxBackups int `mapstructure:"max_backups"`
}

func Init(FilePath string) (err error) {
	//思路就是从程序运行的参数获取切片对应位置的信息将其设置成配置文件路径,然后读取配置文件信息,将信息存储到内部的结构体中,再将
	//内部结构体的配置信息反序列化到我们定义的结构体中而且这个信息应该跟我们yaml文件里面的信息一致

	//viper.SetConfigFile("./config.yaml")
	//viper.SetConfigName("config") //指定配置文件名称
	//viper.SetConfigType("yaml")   //指定配置文件类型(专门从远程获取配置信息)
	//viper.AddConfigPath(".")      // 指定查找配置文件的路径（这里使用相对路径）
	viper.SetConfigFile(FilePath) // 设置配置文件路径
	err = viper.ReadInConfig()    //读取配置文件信息,将信息存储到内部的结构体中

	if err != nil {
		//读取配置文件失败
		fmt.Printf("viper.ReadInConfig() failed,err :%v\n", err)
		return
	}

	//把读取到的配置信息反序列化到Conf变量中
	if err := viper.Unmarshal(Conf); err != nil {
		fmt.Printf("viper.Unmarshal faild,err:%v\n", err)
	}

	viper.WatchConfig() //// 开始监听配置文件的更改
	viper.OnConfigChange(func(in fsnotify.Event) {
		// 当配置文件发生更改时，执行这个回调函数
		fmt.Println("配置文件修改了")
		if err := viper.Unmarshal(Conf); err != nil {
			fmt.Printf("viper.Unmarshal faild,err:%v\n", err)
		}
	})
	return
}
